#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
#include <signal.h>

// 函数原型
void kill_process(int pid);

// 在main函数之前添加这行代码，用于声明kill函数
extern int kill(pid_t pid, int sig);



// 定义存储进程信息的结构体
struct ProcessInfo {
    int pid; // 进程号
    char name[255]; // 进程名字
};

// 函数原型
void get_process();

int main() {
    get_process();
    int pid_to_kill;
    printf("Enter the Process ID to kill: ");
    scanf("%d", &pid_to_kill);
    kill_process(pid_to_kill);
    return 0;
}

void get_process() {
    DIR *dir;
    struct dirent *entry;
    
    // 打开/proc目录
    dir = opendir("/proc");
    
    if (dir == NULL) {
        perror("Error opening /proc directory");
        exit(EXIT_FAILURE);
    }

    // 遍历/proc目录
    while ((entry = readdir(dir)) != NULL) {
        // 判断是否为数字，即进程目录的格式
        if (entry->d_type == DT_DIR && atoi(entry->d_name) != 0) {
            int pid = atoi(entry->d_name);

            // 读取进程名字
            char stat_path[255];
            snprintf(stat_path, sizeof(stat_path), "/proc/%d/stat", pid);

            FILE *stat_file = fopen(stat_path, "r");
            if (stat_file == NULL) {
                perror("Error opening stat file");
                exit(EXIT_FAILURE);
            }

            // 读取进程名字
            char process_name[255];
            fscanf(stat_file, "%*d %s", process_name);
            fclose(stat_file);

            // 打印进程信息
            printf("Process ID: %d, Name: %s\n", pid, process_name);
        }
    }

    closedir(dir);
}

void kill_process(int pid) {
    // 使用kill函数发送SIGKILL信号杀死指定进程
    if (kill(pid, SIGKILL) == -1) {
        perror("Error killing process");
        // 可以根据需要采取其他错误处理措施，例如打印错误信息并继续执行
    } else {
        printf("Process with ID %d killed successfully.\n", pid);
    }
}
